home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / spool100.zip / SPOOLER.DOC < prev    next >
Text File  |  1990-04-30  |  12KB  |  245 lines

  1.                          SPOOLER ver. 1.0 del 21/04/90
  2.  
  3.                             Paolo Ruggieri - Genova
  4.  
  5.                    Una unit di PUBBLICO DOMINIO per accedere
  6.                     ai servizi di PRINT.COM (spooler MS-DOS)
  7.                  dai programmi in TurboPascal 4.0 o successivi.
  8.  
  9.   Per commenti, suggerimenti e segnalazioni di bugs sono raggiungibile
  10.   via modem presso:
  11.  
  12.                     Utente MC4479 su MC-Link (300/1200/2400 baud, 8-N-1
  13.                                               06-4510211/4513182/4180440
  14.                                               NUA Itapac 26500140)
  15.  
  16.                     o attraverso l'area (echo Italia) TurboPascal presso
  17.                     vari BBS della rete Fido.
  18. ==============================================================================
  19.   Con passare delle versioni MS-DOS e` diventato sempre piu` "ingombrante",
  20. in termini di memoria di massa e RAM occupate; a questo aumento di occupazione
  21. e` corrisposto un aumento di affidabilita`, velocita` e di funzionalita`
  22. soprattutto attraverso l'introduzione di nuove utility (comandi esterni) spesso
  23. dimenticate.
  24.  
  25.   Una di queste utility, presente sin dalla versione 2.00 di MS-DOS, e` PRINT,
  26. lo SPOOLer (Simultaneus Peripheral Operation On-Line) che si occupa di stampare
  27. files mentre il nostro PC e` occupato a fare dell'altro; insomma PRINT e`
  28. l'unico barlume di multitasking (standard) nei sistemi MS-DOS (rigorosamente
  29. monotasking per definizione).
  30.  
  31.   Questa capacita` di operare in concorrenza con altre applicazioni, il fatto
  32. che si occupi dell'interfacciamento con la stampante e che "ruba" meno di 7Kb
  33. di RAM ne fa un valido collaboratore per chi sviluppa applicazioni che
  34. prevedono l'uscita su stampante.
  35.  
  36.   A me sembra piuttosto "elegante" un programma che estrae dati da un database
  37. li formatta in un certo modo, li scarica su di un file sequenziale (temporaneo)
  38. e, terminata l'estrazione, passa il file da stampare allo spooler permettendo
  39. di liberare velocemente (come e` noto la stampante e` la periferica piu` lenta
  40. di un computer) la console che si puo` dedicare ad altri compiti.
  41.  
  42.   In questa ottica PRINT ha un difetto: non cancella (a richiesta) un file dopo
  43. averlo stampato; comunque questa piccola pecca puo` essere facilmente aggirata
  44. (per esempio si puo` depositare tutti i files di stampa in una directory il cui
  45. contenuto viene cancellato dall'AUTOEXEC ad ogni reboot del PC).
  46.  
  47.   Per contro la parte TSR di PRINT ha il grosso pregio di rispondere a tutti
  48. quei processi che lo invocano generando l'interrupt $2F e da qui e` nata l'idea
  49. di creare una unit per Turbo Pascal che mi permettesse di comunicare con questo
  50. spooler dai miei programmi TP.
  51. ==============================================================================
  52. +-----------+
  53. | Interface |
  54. +-----------+
  55.  
  56. CONST
  57. ~~~~~
  58.   MAX_ENTRY_LEN Questa e` la lunghezza delle strighe che vengono passate per
  59.                 indirizzo attraverso SubmitPacket o direttemente.  Vengono
  60.                 passate in formato ASCIIZ quindi la lunghezza aumenta di un
  61.                 carattere per accogliere il NUL finale.
  62.  
  63.   MAX_SPOOLER_ENTRY Numero massimo di files in coda, dipende dallo switch /Q:nn
  64.                     di PRINT (default 10, massimo 32).
  65.  
  66.   MIN_DOS_VERSION Minima versione MS-DOS richiesta:
  67.                       $0200 (versione 2.00)
  68.                         oppure
  69.                       $0300 (versione 3.00)
  70.                   secondo Peter Norton PRINT e` presente a partire dalla
  71.                   versione 2.00 ma l'interfaccia dell'interrupt $2F e`
  72.                   disponibile solo dalla 3.00; mentre per Ray Duncan
  73.                   l'interfaccia era gia` presente a partire dalla versione 2.00
  74.                   ma non e` stata documentata fino alla 3.00.  Dal momento che
  75.                   non ho avuto modo di provare sotto MS-DOS 2.xx nel sorgente
  76.                   (e di conseguenza nella TPU e nel demo) viene richiesta la
  77.                   versione 3.00 o successiva.  Se qualcuno provasse sotto
  78.                   MS-DOS 2.xx mi piacerebbe avere un feedback.
  79.  
  80.                              --+
  81.   SPOOLER_INSTALLED            |
  82.   SPOOLER_NOT_INSTALLED        | Valori di ritorno della funzione SpoolerStatus
  83.   SPOOLER_CANNOT_BE_INSTALLED  |                                  ^^^^^^^^^^^^^
  84.                              --+
  85.  
  86.   QUEUE_FULL Questo e` l'unico valore (diverso da 0) che ho trovato in
  87.              SpoolerResult durante i tests, si verifica quando accodando files
  88.              si supera il massimo dichiarato con lo switch /Q:nn. Se qualcuno
  89.              ne ottenesse altri mi farebbe cosa gradita se me lo facesse
  90.              sapere.
  91.  
  92. TYPE
  93. ~~~~
  94.   EntryType e` il tipo stringa che deve essere passato alle funzioni di
  95.             accodamento e cancellazione.
  96.  
  97.   QueueType e` il tipo array di EntryType che deve essere passato a SubmitFiles
  98.             e ListQueue.
  99.  
  100. VAR
  101. ~~~
  102.   SpoolerResult contiene il valore di ritorno delle chiamate alle procedure e
  103.                 funzioni della UNIT SPOOLER.
  104.  
  105.  
  106. +----------------+
  107. | Implementation |
  108. +----------------+
  109.  
  110. CONST
  111. ~~~~~
  112.   NUL serve a inizializzare i QueueType passati a SubmitFiles e a ListQueue e
  113.       a marcare o testare la fine delle stringhe ASCIIZ.
  114.  
  115.   MAX_ASCIIZ_LEN e` la versione ASCIIZ di MAX_ENTRY_LEN, equivale a
  116.                  MAX_ENTRY_LEN+1 (espressione che viene accettata dal TP 5.x
  117.                  ma non dal 4.0).
  118.  
  119. TYPE
  120. ~~~~
  121.   ASCIIZType       versione ASCIIZ di EntryType.
  122.   ASCIIZQueueType  versione ASCIIZ di QueueType.
  123.  
  124.   SubmitPacketType parametro per la funzione $0101 (Submit File) di PRINT.
  125.  
  126.   cset             parametro per Last.
  127.  
  128.   PathStr          (vedi NOTE PER TURBO PASCAL 4.0).
  129.  
  130. VAR
  131. ~~~
  132.   regs             registri per Intr e MsDos.
  133.  
  134.   HeapFSave        variabile puntatore usata per "parcheggiare" il valore di
  135.                    HeapHerror durante ListQueue.
  136.  
  137.   DosVersion       (vedi NOTE PER TURBO PASCAL 4.0).
  138.  
  139. FUNZIONI e PROCEDURE
  140. ~~~~~~~~~~~~~~~~~~~~
  141. InitializeRegisters: in seguito a problemi con SubmitFile (non accodava!!!) ho
  142.                      introdotto questa procedura che azzera regs prima di ogni
  143.                      chiamata a Intr o MsDos.
  144.  
  145. CarryFlag: restituisce true se, al ritorno da una Intr($2F,regs) in carry flag
  146.            e` settato (errore).
  147.  
  148. Str_to_ASCIIZ: trasforma una stringa TP (array di caratteri preceduto da un
  149.                byte di lunghezza) in una stringa ASCIIZ (array di caratteri
  150.                seguito da un NUL).
  151.  
  152. ASCIIZ_to_Str: trasforma una stringa ASCIIZ in una stringa TP.
  153.  
  154. Last: scandisce una stringa partendo dal fondo memorizzandosi (p) e
  155.       restituendo la prima posizione di uno dei caratteri del cset c.
  156.       (vedi NOTE PER TURBO PASCAL 4.0).
  157.  
  158. FExpand: (vedi NOTE PER TURBO PASCAL 4.0).
  159.  
  160. SpoolerStatus: verifica che la versione MS-DOS non sia inferiore a quella
  161.                richiesta (se no torna SPOOLER_CANNOT_BE INSTALLED) e che PRINT
  162.                sia installato (altrimenti anche SpoolerStatus contiene lo
  163.                stesso valore).
  164.  
  165. SubmitFile: dopo aver verificato che PRINT sia installato (SpoolerStatus)
  166.             richiede l'accodamento del file FileString passando l'indirizzo ad
  167.             un SubmitPacket con LevelCode=0 (attualmente l'unico valore
  168.             possibile) e con l'indirizzo della verisione ASCIIZ di FileString;
  169.             se si sono verificati errori SpoolerResult contiene il codice
  170.             d'errore.
  171.  
  172. SubmitFiles: inizializza l'array Queue, ricava il path (dir) da WildCString e
  173.              con un ciclo di FindFirst e FindNext richiama SubmitFile; dopo
  174.              ogni chiamata se si verifica un errore SpoolerResult contiene il
  175.              codice d'errore mentre se l'accodamento ha avuto successo mette il
  176.              pathname in Queue.
  177.  
  178. CancelFIles: dopo aver verificato che PRINT sia installato (SpoolerStatus)
  179.              richiede la cancellazione (dalla coda) dei files identificati da
  180.              WildCString passando l'indirizzo della versione ASCIIZ di
  181.              WildCString; se si sono verificati errori SpoolerResult contiene
  182.              il codice d'errore.
  183.  
  184. CancelAllFIles: dopo aver verificato che PRINT sia installato (SpoolerStatus)
  185.                 richiede la cancellazione (dalla coda) di tutti i files
  186.                 accodati; se si sono verificati errori SpoolerResult contiene
  187.                 il codice d'errore.
  188.  
  189. HeapFunc: se, in seguito ad una richiesta di allocare memoria (new o getmem),
  190.           lo heap manager non riesce ad allocare il blocco di memoria richiesto
  191.           chiama una funzione far ($f+), il cui puntatore trova in HeapError,
  192.           passandole la dimensione del blocco (dim) e se il valore tornato e` 1
  193.           fara` si che la procedura di allocazione torni un puntatore nil.
  194.           Il puntatore a questa funzione viene mosso in HeapError da ListQueue.
  195.  
  196. ListQueue: dopo aver verificato che PRINT sia installato (SpoolerStatus),
  197.            inizializza l'array Queue e "parcheggia" il puntatore alla funzione
  198.            di errore dello heap contenuto in HeapError e lo sostituisce con
  199.            quello a HeapFunc, alloca un array ASCIIZQueueType (ASCIIZ) e
  200.            ripristina HeapError, se ASCIIZ non e` stato allocato (nil) esce.
  201.            Richiede a PRINT il blocco della coda e la lista dei files in coda
  202.            (funzione $0104), verifica il carry falg e nel caso di errore
  203.            deposita il codice d'errore in SpoolerResult ed esce; se la funzione
  204.            e` giunta buon fine copia dall'indirizzo ottenuto da DS:SI
  205.            all'indirizzo puntato da ASCIIZ sizeof(ASCIIZ^) (dimensione
  206.            dell'oggetto puntato da ASCIIZ) bytes; quindi sblocca la coda
  207.            richiamando la funzione $0105.  Trasforma gli elementi di ASCIIZ^ e
  208.            li passa a Queue finche' non trova un elemento nullo o raggiunge la
  209.            massima dimensione di Queue.  Quindi disalloca ASCIIZ^ ed esce.
  210.  
  211. NOTE PER TURBO PASCAL 4.0
  212. ~~~~~~~~~~~~~~~~~~~~~~~~~
  213.  
  214.   Il tipo PathStr, la funzione FExpand e la variabile DosVersion vengono
  215. definiti solo per la versione 4.0 ($IFDEF VER40) perche` gia` presenti nelle
  216. versini 5.x, mentre la funzione Last e` definita per tutte le versioni ma nelle
  217. versioni 5.x poteva essere sostituita da FSplit (divide un pathname nelle su
  218. componenti).
  219.  
  220. DosVersion: viene caricata nella parte di inizializzazione, tramite la chiamata
  221.             alla funzione $30 di MS-DOS, con la versione di MS-DOS.
  222.  
  223. FExpand: espande il path passato (include il drive e la directory correnti e
  224.          converte '.' e '..').
  225.          Salva il drive/directory corrente, rende corrente il drive/directory
  226.          specificati da path, salva il nuovo drive/directory corrente e
  227.          ripristina il drive/directory iniziale.
  228. ==============================================================================
  229. Bibliografia:
  230.  
  231.   Ray Duncan, "Advanced MS-DOS programming" 2nd ed., 1988 Microsoft Press
  232.   Peter Norton, "PC IBM: guida del programmatore", 1986 Arnoldo Mondadori
  233.                ("Programmer's guide to IBM PC", 1985 Microsoft Press)
  234. ==============================================================================
  235.  
  236.   Questa UNIT (tutti i files SORGENTI, OGGETTO e di DOCUMENTAZIONE) e` di
  237. PUBBLICO DOMINIO.
  238.   E` liberamente copiabile e modificabile ma, d'altra parte, non rispondo di
  239. eventuali errori; comunque chi ne rilevasse e` pregato di segnalarmeli cosi`
  240. che possa correggerli.
  241.   Se la distribuite ad altri includete tutti i files sopra elencati.
  242.   Se la modificate cercate di includere tutti i files sopra elencati piu` la
  243. vostra versione modificata.
  244.  
  245.